class Solution {
    public:
        int sumSubarrayMins(vector<int>& arr) {
            stack<int> st;
            arr.push_back(-1);
            st.push(-1);
            long long n = arr.size(),m = 0,N = 1e9 + 7,ans = 0;
            for(int r = 0;r < n;r++){
                while(st.size() > 1 && arr[st.top()] >= arr[r]){
                    int i = st.top();
                    st.pop();
                    ans += (long long)arr[i]*(i - st.top()) * (r - i);
                    ans %= N;
                }
                st.push(r);
            }
            return ans % N;
        }
    };